package com.larry.design.structural.proxy.dynamic;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * @author larry
 * @Title: design-frame
 * @Package com.larry.design.structural.proxy.dynamic
 * @Description: TODO
 * @date 9/1/2110:55 AM
 */
public class DynamicTikTok<T> implements InvocationHandler{

    private T target;

    public DynamicTikTok(T target) {
        this.target = target;
    }

    /**
     * ClassLoader loader,当前被代理对象的类加载器
     * Class<?>[] interfaces,当前被代理对象所实现的所以接口
     * InvocationHandler h,当前被代理对象执行目标方法时,使用h定义拦截增强方法
     * @param t
     * @param <T>
     * @return
     */
    public static<T> T getProxy(T t){
        Object o = Proxy.newProxyInstance(t.getClass().getClassLoader(), t.getClass().getInterfaces(), (InvocationHandler) new DynamicTikTok(t));
        return (T) o;
    }

    /**
     * 定义目标方法的拦截逻辑,每个方法都会进来
     *
     * @param proxy
     * @param method
     * @param args
     * @return
     * @throws Throwable
     */
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

        //反射执行
        System.out.println("真正执行被代理对象的方法");
        Object invoke = method.invoke(target, args);
        System.out.println(invoke);
        return invoke;
    }
}
